package service

import (
	"context"
	"fmt"
	"os"
	"strings"
	"time"

	"gitee.com/liumou_site/ssh-go-automatic-upgrade/internal/config"
	"go.uber.org/zap"
)

// RegisterService 注册SSH自动升级服务
// 示例值: args为命令行参数对象
func (m *ServiceManager) RegisterService(args interface{}) bool {
	zap.L().Info("开始注册SSH自动升级服务")

	// 检查root权限
	if os.Geteuid() != 0 {
		zap.L().Error("需要root权限来注册systemd服务")
		return false
	}

	if m.service == nil {
		zap.L().Error("服务实例未初始化")
		return false
	}

	// 检查服务是否已存在，如果存在则先停止和移除
	if err := m.CleanupExistingService(); err != nil {
		zap.S().Errorf("清理现有服务失败: %v", err)
		return false
	}

	// 获取可执行文件路径
	execPath, err := os.Executable()
	if err != nil {
		zap.S().Errorf("获取可执行文件路径失败: %v", err)
		return false
	}

	// 复制可执行文件到系统目录
	systemExecPath := "/usr/sbin/ssh-upgrade"
	if err := m.copyToSystemDir(execPath, systemExecPath); err != nil {
		zap.S().Errorf("复制可执行文件到系统目录失败: %v", err)
		return false
	}

	// 构建命令行参数
	var commandArgs []string
	if argsObj, ok := args.(*config.Args); ok {
		// 将命令行参数转换为字符串切片
		if cmdArgs := argsObj.GetCommandArgs(); cmdArgs != "" {
			// 简单的空格分割，实际使用时可能需要更复杂的解析
			commandArgs = []string{cmdArgs}
		}
	}

	// 配置服务参数
	m.service.SetExecPath(systemExecPath)
	if len(commandArgs) > 0 {
		m.service.SetArgs(commandArgs)
	}
	m.service.SetDescription("SSH Auto Upgrade Service")
	m.service.SetUser("root")
	m.service.SetGroup("root")
	m.service.SetWorkingDir("/tmp/")
	m.service.SetRestartPolicy("always")

	// 创建服务
	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
	defer cancel()

	if err := m.service.CreateService(ctx); err != nil {
		zap.S().Errorf("创建服务失败: %v", err)
		return false
	}

	// 启用服务
	ctx, cancel = context.WithTimeout(context.Background(), 30*time.Second)
	defer cancel()

	if err := m.service.Enable(ctx); err != nil {
		zap.S().Errorf("启用服务失败: %v", err)
		return false
	}

	// 启动服务
	ctx, cancel = context.WithTimeout(context.Background(), 30*time.Second)
	defer cancel()

	if err := m.service.Start(ctx); err != nil {
		zap.S().Errorf("启动服务失败: %v", err)
		return false
	}

	zap.L().Info("SSH自动升级服务注册成功")

	// 打印服务配置文件内容和服务管理命令
	printServiceInfo()

	return true
}

// printServiceInfo 打印服务配置信息和管理命令
func printServiceInfo() {
	fmt.Println("\n" + strings.Repeat("=", 60))
	fmt.Println("🎉 SSH自动升级服务注册成功！")
	fmt.Println(strings.Repeat("=", 60))

	// 读取并显示.service文件内容
	serviceFilePath := "/etc/systemd/system/ssh-auto-upgrade.service"
	if data, err := os.ReadFile(serviceFilePath); err == nil {
		fmt.Println("\n📄 .service 配置文件内容:")
		fmt.Println(strings.Repeat("-", 40))
		fmt.Printf("📂 文件路径: %s\n", serviceFilePath)
		fmt.Println(strings.Repeat("-", 40))
		fmt.Println(string(data))
	}

	fmt.Println("\n🔧 服务管理命令:")
	fmt.Println(strings.Repeat("-", 40))
	fmt.Println("# 启动服务")
	fmt.Println("sudo systemctl start ssh-auto-upgrade.service")
	fmt.Println("\n# 停止服务")
	fmt.Println("sudo systemctl stop ssh-auto-upgrade.service")
	fmt.Println("\n# 查看服务状态")
	fmt.Println("sudo systemctl status ssh-auto-upgrade.service")
	fmt.Println("\n# 查看服务日志")
	fmt.Println("sudo journalctl -u ssh-auto-upgrade.service -f")
	fmt.Println("\n# 重启服务")
	fmt.Println("sudo systemctl restart ssh-auto-upgrade.service")
	fmt.Println("\n# 禁用服务")
	fmt.Println("sudo systemctl disable ssh-auto-upgrade.service")
	fmt.Println("\n# 启用服务")
	fmt.Println("sudo systemctl enable ssh-auto-upgrade.service")

	fmt.Println("\n📊 当前服务状态:")
	fmt.Println(strings.Repeat("-", 40))
	fmt.Println("# 检查服务是否运行")
	fmt.Println("systemctl is-active ssh-auto-upgrade.service")
	fmt.Println("\n# 检查服务是否启用")
	fmt.Println("systemctl is-enabled ssh-auto-upgrade.service")

	fmt.Println("\n" + strings.Repeat("=", 60))
}
